#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h> // exit()
#include <sys/wait.h>

int main(int argc, char const *argv[])
{
    // 1 创建队列   1.1  做队列的配置最大长度 每条最大多大
    struct mq_attr attr;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = 1024;
    char *mq_name = "/mq_0724";
    //  1.2  mq_open  得到 队列描述符
    mqd_t mq_fd = mq_open(mq_name, O_RDWR | O_CREAT, 0644, &attr);

    //    2 fork子进程
    pid_t pid = fork();
    if (pid > 0)
    {
        //       父进程
        //            循环向队列发送数据 10次
        for (int i = 1; i <= 10; i++)
        {
            char buf[1024];
            sprintf(buf, " 消息：%d", i);
            mq_send(mq_fd, buf, strlen(buf), 0);

            sleep(1);
        }
        // 等待子进程结束
        waitpid(pid, NULL, 0);
    }
    else if (pid == 0)
    { //       子进程

        for (size_t i = 0; i < 10; i++)
        { //  接受队列把结果写入缓存 ，打印
            sleep(1);
            char buf[1024] = {0};

            int ret = mq_receive(mq_fd, buf, 1024, NULL);
            if (ret == -1)
            {
                perror("mq_receive");
                exit(EXIT_FAILURE);
            }
            printf("子进程接受到消息：%s\n", buf);
        }
        //  结束
        printf("子进程接受完成\n");
        _exit(EXIT_SUCCESS);
    }
    //     3  unlink 回收队列资源
    mq_unlink(mq_name);

    return 0;
}
